package com.carl.mall.product.service.impl;


import com.carl.mall.product.convert.EntityToVoConvert;
import com.carl.mall.product.dao.AttrAttrgroupRelationDao;
import com.carl.mall.product.entity.AttrAttrgroupRelationEntity;
import com.carl.mall.product.service.AttrService;
import com.carl.mall.product.vo.AttrGroupAttrResponseVO;
import com.carl.mall.product.vo.AttrResponseVO;
import com.carl.mall.product.vo.SpuItemGroupAttrVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;


import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;


import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.carl.common.utils.PageUtils;
import com.carl.common.utils.Query;

import com.carl.mall.product.dao.AttrGroupDao;
import com.carl.mall.product.entity.AttrGroupEntity;
import com.carl.mall.product.service.AttrGroupService;
import org.springframework.util.StringUtils;


@Service("attrGroupService")
public class AttrGroupServiceImpl extends ServiceImpl<AttrGroupDao, AttrGroupEntity> implements AttrGroupService {


    @Autowired
    private AttrAttrgroupRelationDao attrAttrgroupRelationDao;

    @Autowired
    private AttrGroupDao attrGroupDao;

    @Autowired
    private AttrService attrService;


    @Override
    public PageUtils queryPage(Map<String, Object> params) {
        IPage<AttrGroupEntity> page = this.page(
                new Query<AttrGroupEntity>().getPage(params),
                new QueryWrapper<AttrGroupEntity>()
        );

        return new PageUtils(page);
    }


    /**
     * 查询分类下所有属性分组
     * @param params 查询条件
     * @param catelogId  如果为0，则查询所有
     * @return
     */
    @Override
    public PageUtils queryPageWithTree(Map<String, Object> params, Long catelogId) {
        //获取检索的关键字
        String key = (String) params.get("key");
        QueryWrapper<AttrGroupEntity> wrapper = new QueryWrapper<>();
        if (!StringUtils.isEmpty(key)){
            /*
             * 继续构造查询条件，通过lambda表达式指定查询条件。
             * 这里使用了方法引用 obj.eq("attr_group_id", key) 来判断属性组ID是否等于给定的key，
             * 并使用 or() 方法连接另一个条件，即使用 like("attr_group_name", key) 方法判断属性组名称是否包含给定的key。
             * 这样做的目的是为了同时匹配属性组ID和属性组名称，以提高查询的准确性和灵活性。
             */
            wrapper.and(obj -> {
                obj.eq("attr_group_id", key).or().like("attr_group_name", key);
            });

        }
        if (catelogId == 0){
           //根据分页条件params查询（所有的）属性组信息
            IPage<AttrGroupEntity> page = this.page(
                    new Query<AttrGroupEntity>().getPage(params),
                    wrapper
            );
            return new PageUtils(page);
        }else {
            //根据类别编号查询属性组信息
            wrapper.eq("catelog_id",catelogId);
            IPage<AttrGroupEntity> page = this.page(
                    new Query<AttrGroupEntity>().getPage(params),
                    wrapper
            );
            return new PageUtils(page);
        }

        
    }

    @Override
    public List<AttrGroupAttrResponseVO> getAttrGroupAndAttr(Long catelogId) {
        //在属性分组表中通过分类的id查出分组的信息
        List<AttrGroupEntity> attrGroupEntities = attrGroupDao.selectList(new QueryWrapper<AttrGroupEntity>().eq("catelog_id", catelogId));
        List<AttrGroupAttrResponseVO> list = attrGroupEntities.stream().map((group)->{
            //将每一个分组的信息转换成响应体
            AttrGroupAttrResponseVO attrGroupAttrResponseVO = EntityToVoConvert.INSTANCE.attrGroupAttrEnToVo(group);
            //通过分组id查出所有分类的信息
            List<AttrResponseVO> attrResponseVOList = attrService.queryByAttrGroupId(group.getAttrGroupId());
            //设置一个分组下的规格参数
            attrGroupAttrResponseVO.setAttrs(attrResponseVOList);
            //返回这个分组下的规格参数信息
            return attrGroupAttrResponseVO;
        }).collect(Collectors.toList());

        return list;
    }

    /**
     * 跟进SpuId和CatalogId查询出对应的 属性组及其属性信息
     * @param spuId
     * @param catalogId
     * @return
     */
    @Override
    public List<SpuItemGroupAttrVO> getAttrgroupWithSpuId(Long spuId, Long catalogId) {
        //
        List<SpuItemGroupAttrVO> groupAttrVo = attrGroupDao.getAttrgroupWithSpuId(spuId,catalogId);
        return groupAttrVo;
    }


}